#include "bib_Berkeley.h"

//Crea el archivo de Base de Datos
int abrirBD(DB **punteroDB){
	char cadenaError[TAM_ERROR_BD + 1];
	int nroError;

	if (nroError = db_create(punteroDB, NULL, 0)){
		sprintf(cadenaError, "%d", nroError);
		imprimirLog(ERROR, "No se pudo crear/abrir la base de datos", cadenaError);
		return EXIT_FAILURE;
	}
		
	if (nroError = (*punteroDB)->open(*punteroDB, NULL, "fileSystem.db", NULL, DB_BTREE, DB_CREATE, 0)){
		sprintf(cadenaError, "%d", nroError);
		imprimirLog(ERROR, "No se pudo crear/abrir la base de datos", cadenaError);
		return EXIT_FAILURE;
	}
	
	imprimirLog(INFO, "Base de datos creada/abierta", "");
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int escribirBD(DB *punteroDB, long *id, char* cadena){
	//Campos de la BD
	DBT clave, dato;
	char cadenaError[TAM_ERROR_BD + 1];
	int nroError;

	memset(&clave, 0, sizeof(DBT));
	memset(&dato, 0, sizeof(DBT));

	clave.data = id;
	clave.size = sizeof(long);
	dato.data = cadena;
	dato.size = TAM_SECTOR;

	if (nroError = punteroDB->put(punteroDB, NULL, &clave, &dato, 0)){
		sprintf(cadenaError, "%d", nroError);
		imprimirLog(ERROR, "No se pudo escribir en la base de datos", cadenaError);
		return EXIT_FAILURE;	
	}

	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int leerBD(DB *punteroDB, long *id, char* cadena){
	//Campos de la BD
	DBT clave, dato;
	char cadenaError[TAM_ERROR_BD + 1];
	int nroError;

	memset(&clave, 0, sizeof(DBT));
	memset(&dato, 0, sizeof(DBT));

	clave.data = id;
	clave.size = sizeof(long);

	dato.data = cadena;
	dato.ulen = TAM_SECTOR;
	dato.flags = DB_DBT_USERMEM;

	if (nroError = punteroDB->get(punteroDB, NULL, &clave, &dato, 0)){
		sprintf(cadenaError, "%d", nroError);
		imprimirLog(ERROR, "No se pudo leer de la base de datos", cadenaError);
		return EXIT_FAILURE;	
	}

	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int cerrarBD(DB *punteroDB){
	//Cerrar Base de Datos
	char cadenaError[TAM_ERROR_BD + 1];
	int nroError;
	
	if (nroError = punteroDB->sync(punteroDB, 0)){
		sprintf(cadenaError, "%d", nroError);
		imprimirLog(WARNING, "sync ERROR", cadenaError);
		return EXIT_FAILURE;	
	}
	
	if (nroError = punteroDB->close(punteroDB, 0)){
		sprintf(cadenaError, "%d", nroError);
		imprimirLog(ERROR, "No se pudo cerrar la base de datos", cadenaError);
		return EXIT_FAILURE;	
	}
	
	imprimirLog(INFO, "Base de datos cerrada", "");
	return EXIT_SUCCESS;
}